package ar.edu.utn.frgp.TPFinalBanco.action;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;

import com.opensymphony.xwork2.ActionContext;
import ar.edu.utn.frgp.TPFinalBanco.model.Cliente;
import ar.edu.utn.frgp.TPFinalBanco.model.Cuenta;
import ar.edu.utn.frgp.TPFinalBanco.model.Movimiento;
import ar.edu.utn.frgp.TPFinalBanco.model.OrigenMovEnum;
import ar.edu.utn.frgp.TPFinalBanco.model.Prestamo;
import ar.edu.utn.frgp.TPFinalBanco.model.TipoMovimientoEnum;
import ar.edu.utn.frgp.TPFinalBanco.service.impl.GestionCuentaServiceImpl;
import ar.edu.utn.frgp.TPFinalBanco.service.impl.GestionMovimientosServiceImpl;
import ar.edu.utn.frgp.TPFinalBanco.service.impl.GestionPrestamoServiceImpl;

public class PrestamoAction extends BaseAction {
	
	private static final long serialVersionUID = 1L;
	
	private Map<String, Object> session;
	private Cliente cliente;
	private Date fechaAlta;
	private BigDecimal monto;
	private Integer cantCuotas;
	private BigDecimal interes;
	private Integer nroCuenta;
	private Boolean tiene;
	private Date ahora;
	

	@Override
	public String execute() throws Exception {
		
		// Paso la session
		setSession(ActionContext.getContext().getSession());
		setCliente((Cliente) session.get("cliente"));
		
		//obtengo la fecha del sistema
		setAhora(new Date());
		//verifico si el cliente tiene cuentas
		if(((Cliente) session.get("cliente")).getCantCuentas() > 0){
			setTiene(true);
			//paso las cuetas del cliente
			List<Cuenta> cuentas;
			cuentas = ((Cliente) session.get("cliente")).getCuentas();
			session.put("cuentas",cuentas);
		}		
		
		if((getMonto().compareTo(new BigDecimal(5000))>1)&&(getInteres().compareTo(new BigDecimal(0))>1)){
		
		GestionPrestamoServiceImpl prestamoService = (GestionPrestamoServiceImpl) getContext()
				.getBean("gestionPrestamoService");
		
		//creamos un prestamo
		Prestamo prestamo = new Prestamo(fechaAlta,monto,cantCuotas,interes.divide(new BigDecimal(100)),cliente.getDni());
		
		//si tiene cuentas
		if(((Cliente) session.get("cliente")).getCantCuentas() > 0){
			setTiene(true);
			prestamo.setNroCuenta(getNroCuenta());
			//traigo la cuenta
			GestionCuentaServiceImpl cuentaService = (GestionCuentaServiceImpl) getContext()
					.getBean("gestionCuentasService");
			Cuenta cuenta = cuentaService
					.getCuenta(getNroCuenta());
			
			BigDecimal saldoActual = cuenta.getSaldo().add(getMonto());
			
			// Genero el movimiento y lo agrego en la BD
			Movimiento movimiento = new Movimiento(
					cuenta, new Date(),
					TipoMovimientoEnum.D, OrigenMovEnum.PR, saldoActual,
					monto);
			
			GestionMovimientosServiceImpl movimientosService = (GestionMovimientosServiceImpl) getContext()
					.getBean("gestionMovimientosService");
			movimientosService.createMovimiento(movimiento);

			// Actualizo el saldo de la cuenta y lo guardo en la BD
			cuenta.setSaldo(saldoActual);
			cuentaService.updateCuenta(cuenta);

			// Actualizo la cuenta en la sesión
			List<Cuenta> cuentas = cliente.getCuentas();

			for (Cuenta cuentaCliente : cuentas) {
				if (cuentaCliente.getNroCuenta().equals(cuenta.getNroCuenta())) {
					cuentaCliente.setSaldo(saldoActual);
				}
			}

			cliente.setCuentas(cuentas);
			ActionContext.getContext().getSession().put("cliente", cliente);
		}
		
		
		//lo guardo en la db
		prestamoService.savePrestamo(prestamo);
		
		return SUCCESS;
		}else{
			addActionError("Los parametros ingresados son incorrectos");
			return ERROR;
		}				
	}


	public Cliente getCliente() {
		return cliente;
	}

	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}
	
	public Date getFechaAlta() {
		return fechaAlta;
	}
	public BigDecimal getMonto() {
		return monto;
	}
	public Integer getCantCuotas() {
		return cantCuotas;
	}
	public BigDecimal getInteres() {
		return interes;
	}

	public void setFechaAlta(Date fechaAlta) {
		this.fechaAlta = fechaAlta;
	}
	
	public void setMonto(BigDecimal monto) {
		this.monto = monto;
	}
	
	public void setCantCuotas(Integer cantCuotas) {
		this.cantCuotas = cantCuotas;
	}
	
	public void setInteres(BigDecimal interes) {
		this.interes = interes;
	}


	public Map<String, Object> getSession() {
		return session;
	}


	public void setSession(Map<String, Object> session) {
		this.session = session;
	}


	public Integer getNroCuenta() {
		return nroCuenta;
	}


	public void setNroCuenta(Integer nroCuenta) {
		this.nroCuenta = nroCuenta;
	}


	public Boolean getTiene() {
		return tiene;
	}


	public void setTiene(Boolean tiene) {
		this.tiene = tiene;
	}


	public Date getAhora() {
		return ahora;
	}


	public void setAhora(Date ahora) {
		this.ahora = ahora;
	}

}
